package com.guan.mysolutionstudy;

import org.junit.Test;

/**
 * @ClassName TwoNumberAdd
 * @Author GuanCary
 * @Date 2020/5/13 18:52
 * @Version 1.0
 * Leetcode:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储，
 * 它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
 * <p>
 * 你可以假设除了数字 0 之外，这两个数字都不会以零开头。
 **/
//创建一个链表类


//要对头结点进行操作时，考虑创建哑节点dummy，使用dummy->next表示真正的头节点。这样可以避免处理头节点为空的边界问题。
public class TwoNumberAdd {
    public ListNode solution(ListNode listNode1, ListNode listNode2) {
        //dummy翻译为虚设,虚设一个节点,这样他就有next节点指向真正的头结点
        // ListNode dummyNode = new ListNode(0);
        //把两个节点带入p和q
        ListNode tempListNode = new ListNode(0);
     /*   ListNode p = listNode1, q = listNode2;
        //进位
        int carry = 0;
        while (p != null || q != null) {
            //相加
            int sum = p.value + q.value + carry;
            //进位除以10进制
            carry = sum / 10;
            //余数记录位新节点,remainder余数的意思
            int remainderValue = sum % 10;
            tempListNode.next = new ListNode(remainderValue);
            tempListNode = tempListNode.next;
            System.out.println(tempListNode.value);
            p = p.next;
            q = q.next;
        }
        if (carry > 0) {
            tempListNode.next = new ListNode(carry);
            System.out.println(tempListNode.next.value);
        }
        return tempListNode.next;*/
        //上面这种方法,得到的链表多了一个0,而且是从高位开始,所以要用下面这个方法
        //dummy翻译为虚设,虚设一个节点,这样他就有next节点指向真正的头结点
        ListNode dummyHead = new ListNode(0);
        ListNode p = listNode1, q = listNode2, curr = dummyHead;
        //carry 表示进位数
        int carry = 0;
        while (p != null || q != null) {
            int x = (p != null) ? p.value : 0;
            int y = (q != null) ? q.value : 0;
            int sum = carry + x + y;
            //进位数
            carry = sum / 10;
            //新节点的数值为sum % 10
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (p != null) {
                p = p.next;
            }
            if (q != null) {
                q = q.next;
            }
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return dummyHead.next;
    }

    @Test
    public void test() {
        solution(new ListNode(3, new ListNode(7, new ListNode(5))),
                new ListNode(2, new ListNode(3, new ListNode(4))));
    }
}